import { alertModal } from '@/components/Modal'
import ipaddr from 'ipaddr.js'

let regexEnum = {
	serial: '^[0-9a-zA-Z]{16}$',
	serial2: '^[0-9a-zA-Z]{10}$',
	/**账号:仅允许输入英文、汉字、数字、下划线（_）、减号（-）、@、点号（.）、左括号（，右括号），#号 */
	account: '^[\u4e00-\u9fa5A-Za-z0-9-._@#()（）]+$',
	/**邮箱：英文字母（大小写）、数字、“_”、“@”、“.”、“-” */
	email: '^[\\w][\\w|-]+(\\.[\\w|-]+)*@[\\w|-]+(\\.[\\w|-]+)+$',
	/**姓名：仅允许输入英文、汉字、数字、下划线（_）、减号（-）、@、点号（.）、左括号（，右括号），#号 */
	name: '^^[\u4e00-\u9fa5A-Za-z0-9-._@#()（）]+$',
	/**密码：英文字母(大小写)、数字、“_”、“.” */
	password: '^[\\w\\.]+$',
	/**手机号码：11位纯数字的手机号码 */
	mobile: '^\\d{11}$', // 11位纯数字的手机号码
	/**座机：分机只允许输入"数字、（、）、，、-、；、*、+、#、空格、."！ */
	extNum: '^[0-9（）()\\-，,；;*+#. ]{1,30}$',
	/**传真：0-32位数的数字或- */
	fax: '^[0-9\\-]{0,32}$',
	/**用户编号 */
	jobNum: '^[0-9a-zA-Z]{1,32}$', // 数字、字母,
	/**殊字符 \/" '<> */
	inputSpecialCharacters: '/\\<|\\>|"|\'|\\/|\\\\/ig',
	accountApp:
		'^[\u4e00-\u9fa5A-Za-z0-9]+$|^[\u4e00-\u9fa5A-Za-z0-9]+[\u4e00-\u9fa5A-Za-z0-9_\\.@-]*[\u4e00-\u9fa5A-Za-z0-9]+$', // 英文、数字、汉字、下划线(_)、减号(-)、点号(.)、@且首字符和尾字符仅允许英文中文或数字
	/**网络域名：英文（大小写不敏感）、数字、“.”、“-”,":" */
	networkDomain: '^[0-9a-zA-Z.\\-\\:]{1,64}$',
	/**域名称:中文、字母（区分大小写）、数字、连字符（-）和实心点（.） */
	domainName: '^[\u4e00-\u9fa5A-Za-z0-9-.]+$',
	moid: '^[0-9a-zA-Z\\-]{1,36}$', //数字 0-9、英文字母、分隔符“-”
}
const checkIsString = (value: any) => {
	return typeof value == 'string' ? true : false
}
/**是否为非负整数 */
const checkIsUnsignedInteger = (value: any) => {
	var reg = /^\d+$/
	return checkIsRegExp(reg, value)
}
const checkIsRegExp = (reg: any, value: any) => {
	if (checkIsString(value)) {
		reg = new RegExp(reg)
	}
	if (!reg.test(value)) {
		return false
	}
	return true
}
/**
 * 校验是否为正整数（第一位不能是0开头）
 * @param value 数值
 * @returns
 */
const checkIsPositiveInteger = (value: string | number) => {
	var reg = /^[1-9]*[1-9][0-9]*$/
	return checkIsRegExp(reg, value)
}
/**
 * 校验账号
 * @param value 账号
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkAccount = (value: string, isAutoTip?: boolean) => {
	let len = value.length
	let msg: string = ''
	let regLen = /^[0-9]*$/
	if (regLen.test(value) && (len === 7 || len === 11 || len === 13)) {
		msg = '账号不能为7/11/13位纯数字'
		!isAutoTip && alertModal({ msg })
		return false
	}
	if (!checkIsRegExp(regexEnum.account, value)) {
		msg = '账号仅允许输入英文、汉字、数字、下划线（_）、减号（-）、@、点号（.）、左括号（、右括号）、#号'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
const checkIsIP4 = (value: string) => {
	var reg =
		/^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])[\\.](25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)[\\.](25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)[\\.](25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$/
	return reg.test(value)
}
const checkIsIP6 = (value: string) => {
	var reg1 = /^[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}$/
	var reg2 = /^(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)::(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)$/
	var check = reg1.test(value) || reg2.test(value)
	return check
}
const checkIsIP = (value: string) => {
	var checkV4 = checkIsIP4(value)
	var checkV6 = checkIsIP6(value)
	return checkV4 || checkV6
}
const checkLength = (value: string, len: number) => {
	if (value.length > len) {
		return false
	}
	return true
}
/**
 * 校验姓名
 * @param value 姓名
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkName = (value: string, isAutoTip?: boolean) => {
	let msg: string = ''
	if (!checkIsRegExp(regexEnum.name, value)) {
		msg = '姓名仅允许输入英文、汉字、数字、下划线（_）、减号（-）、@、点号（.）、左括号（、右括号）、#号'
		!isAutoTip && alertModal({ msg })
		return false
	}
	if (!checkLength(value, 21)) {
		msg = '姓名长度不能大于21位字符'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
/**
 * 校验邮箱
 * @param value 邮箱
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkEmail = (value: string, isAutoTip?: boolean) => {
	let msg: string = ''
	if (!checkIsRegExp(regexEnum.email, value)) {
		msg = '请输入正确的邮箱地址'
		!isAutoTip && alertModal({ msg })
		return false
	}
	if (!checkLength(value, 64)) {
		msg = '邮箱地址长度不能大于64位字符'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
/**
 * 校验手机号码
 * @param value 手机号码
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkMobile = (value: string, isAutoTip?: boolean) => {
	let msg: string = ''
	if (!checkIsRegExp(regexEnum.mobile, value)) {
		msg = '请输入正确的手机号码'
		!isAutoTip && alertModal({ msg })
		return false
	}
	if (!checkLength(value, 11)) {
		msg = '手机号码长度不能大于11位字符'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
/**
 * 校验座机
 * @param value 座机
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkExtNum = (value: string, isAutoTip?: boolean) => {
	let msg: string = ''
	if (!checkIsRegExp(regexEnum.extNum, value)) {
		msg = '座机长度不超过30,只允许输入"数字、（、）、，、-、；、*、+、#、空格、."'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
/**
 * 校验网络域名
 * @param value 网络域名
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkNetworkDomain = (value: string, isAutoTip?: boolean) => {
	let msg: string = ''
	if (!checkIsRegExp(regexEnum.networkDomain, value)) {
		msg = '网络域名长度不超过128,只允许输入"英文、数字、.、-、:"'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
/**
 * 校验传真
 * @param value 传真
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkFax = (value: string, isAutoTip?: boolean) => {
	let msg: string = ''
	if (!checkIsRegExp(regexEnum.fax, value)) {
		msg = '传真只允许输入数字和-，长度不超过32位'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
/**
 * 校验域名称
 * @param value 域名称
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkDomainName = (value: string, isAutoTip?: boolean) => {
	let msg: string = ''
	if (!checkIsRegExp(regexEnum.domainName, value)) {
		msg = '域名称只允许输入"中文、字母、数字、-、."'
		!isAutoTip && alertModal({ msg })
		return false
	}
	if (!checkLength(value, 60)) {
		msg = '域名称长度不超过60个字符'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
/**
 * 校验用户编号
 * @param value 用户编号
 * @param isAutoTip 是否要有自定义提示，true:要自定义提示 默认false
 * @returns
 */
const checkJobNum = (value: string, isAutoTip?: boolean) => {
	let msg: string = ''
	if (!checkIsRegExp(regexEnum.jobNum, value)) {
		msg = '用户编号长度不超过32,只允许输入"数字、字母"'
		!isAutoTip && alertModal({ msg })
		return false
	}
	return true
}
const checkMac = (value: string) => {
	value = value.replace(/-/g, ':')
	let reg = /^([0-9a-fA-F]{2})(([/\\s:][0-9a-fA-F]{2}){5})$/
	let flag = reg.test(value)
	return flag
}
const toFullIPV6Addr = (addr: string) => {
	if (!checkIsIP6(addr)) {
		return addr
	}
	try {
		addr = ipaddr.parse(addr).toNormalizedString()
		let list = addr.split(':')
		list = list.map((item) => {
			return item.padStart(4, '0')
		})
		return list.join(':').toUpperCase()
	} catch (e) {
		throw console.error(e)
	}
}
const checkIsExistSelfIP = (resetList: string | any[]) => {
	let selfIPList: string | null = localStorage.getItem('ip-mac_List')
	if (!selfIPList) {
		return true
	}
	try {
		let list = JSON.parse(selfIPList)
		if (!(list && list.length > 0)) {
			return true
		}
		for (let i = 0; i < resetList.length; i++) {
			for (let k = 0; k < list.length; k++) {
				if (toFullIPV6Addr(list[k].ip) === resetList[i].ip && list[k].mac === resetList[i].mac) {
					return true
				}
			}
		}
		return false
	} catch (e) {}
}
export {
	checkIsRegExp,
	/**是否为正整数（第一位不能是0开头） */
	checkIsPositiveInteger,
	/**校验账号 */
	checkAccount,
	/**校验手机号码 */
	checkName,
	/**校验邮箱 */
	checkEmail,
	/**校验手机号码 */
	checkMobile,
	/**校验座机 */
	checkExtNum,
	/**网络域名 */
	checkNetworkDomain,
	/**域名 */
	checkDomainName,
	/**传真 */
	checkFax,
	/**校验IP4 */
	checkIsIP4,
	/**校验IP6 */
	checkIsIP6,
	/**校验IP */
	checkIsIP,
	/**校验是否为非负整数 */
	checkIsUnsignedInteger,
	/**校验用户编号 */
	checkJobNum,
	/**校验Mac */
	checkMac,
	toFullIPV6Addr,
	checkIsExistSelfIP,
}
